package com.codeyang.utils;

import org.springframework.util.CollectionUtils;

import java.util.ArrayList;
import java.util.List;

/**
 * 描述: 数据截取工具类
 * 增强性能平衡
 *
 * @author CodeYang_Site
 * @version 2021/5/7 0:11
 */
public class DataSplitUtil {

    private DataSplitUtil() {

    }

    /**
     * 截取数据
     * 是将大数据
     *  截取成同类型的小数据
     * @param allData  所有的数据
     * @param bathSize 小批量数据的长度
     * @param <T>      小批量的数据 </>泛型约束
     * @return
     */
    public static <T> List<List<T>> splitList(List<T> allData, int bathSize) {

        if (CollectionUtils.isEmpty(allData)){
            throw  new IllegalArgumentException("被截取集合不能为空");
        }
        // 页大小
        int totalSize = allData.size();
        // 页码取值 [0~num)
        int totalPage = totalSize % bathSize == 0 ? totalSize / bathSize : (totalSize / bathSize + 1);
        List<List<T>> bathDatas = new ArrayList<>(totalPage);
        for (int i = 0; i < totalPage; i++) {
            // 截取-开始参数
            // total 21 每页10
            // 1 0-10
            // 2 10-20
            // 3 20-21
            int startIndex = i * bathSize;
            int endIndex = (i + 1) * bathSize;
            if (endIndex > totalSize){
                endIndex = totalSize;
            }
            //截取的小批量数据
            List<T> ts = allData.subList(startIndex, endIndex);
            bathDatas.add(ts);
        }
        return bathDatas;
    }
}
